package org.ccay.core.log;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;


/**
 * 审计日志注解。<br>
 * 在需要记录审计日志（操作日志）的方法上添加该注解，审计日志将记录方法调用时的上下文信息，
 * 包括：调用者、调用的时间、所执行的操作（类、方法）等。
 * </p>
 * 
 * <code>Audit</code>注解提供了多种属性设置，用来配置审计消息：<BR>
 * 1. auditor属性用来指定一个审计员（Auditor）实现类，通过审计员获取详细的审计消息；<BR>
 * 2. message属性用来指定审计消息，它支持SpEL表达式，消息格式："Hello {SpEL表达式}"；<BR>
 * 3. value属性的作用与message相当，它是message属性的别名。
 * 4. module属性用来指定模块的名称；
 * 5. objectId属性用来指定对象的类型；
 * 6. operation	操作名称，不提供时取方法的名称
 * <BR>
 * <BR>
 * Created：2011-9-8
 * @author chaowangbang
 * @version:
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Audit {
	
	/**
	 * 审计员 
	 * 
	 * @return
	 */
	Class<? extends IAuditor> auditor() default NullAuditor.class;
	
	/**
	 * 审计消息，作用与message相当，是message的别名。
	 * 
	 * @return
	 */
	String value() default "";
	
	/**
	 * 审计消息，支持SpEL表达式
	 * 
	 * @return
	 */
	String message() default "";
	
	/**
	 * 模块信息
	 * 
	 * @return
	 */
	String module() default "";
	
	/**
	 * 操作描述。
	 * 不指定时，默认取方法的名称
	 * 
	 * @return
	 */
	String operation() default "";
	
	/**
	 * 是否跳过后续操作的审计日志记录。
	 * 如果该值为true, 则本次请求的后续操作将不再记录审计日志。
	 * 
	 * @author chaowangbang
	 * @since Mar 1, 2012
	 * @return
	 */
	boolean skipLatter() default false;
}